iT邦幫忙

2022 iThome 鐵人賽

DAY 23
1

Moleculer Runner

Moleculer Runner 是一個輔助腳本,它可以幫你管理 Moleculer 服務。有了它,你就不用自己建立帶有選項的 ServiceBroker 實例,只要在根目錄新增一個 moleculer.config.js 配置檔,將 Broker 的選項寫在文件內即可。使用時僅需在 npm 腳本中加入 moleculer-runner 來執行,它就會自動載入配置檔,然後創建所有的 Broker 並載入服務。

你可以在配置檔中設定開發用的選項,然後將參數宣告為環境變數,如此一來就可以在生產環境中使用環境變數來替換參數值。

語法

$ moleculer-runner [options] [service files or directories or glob masks]

這個語法只能在 npm 腳本上執行,如果你需要直接在主控台執行的話,請使用 ./node_modules/.bin/moleculer-runner --replnode ./node_modules/moleculer/bin/moleculer-runner.js --repl 來執行。

名稱 類型 預設值 說明
-r, --repl Boolean false 是否在 Broker 啟動後切換到 REPL 模式。
-s, --silent Boolean false 禁用 Log 紀錄,主控台將不會顯示任何東西。
-H, --hot Boolean false 服務改變時就 Hot Reload
-c, --config <file> String null 配置檔的路徑
-e, --env Boolean false 從當前目錄的 .env 檔案讀取環境變數
-E, --envfile <file> String null 從指定檔案讀取環境變數
-i, --instances Number null 指定 Node 實例數量或是設定 max 使用完整 CPU 核心

範例:

{
    "scripts": {
        "dev": "moleculer-runner --repl --hot --config moleculer.dev.config.js services",
        "start": "moleculer-runner --instances=max services"
    }
}

dev 腳本會讀取 moleculer.dev.config.js 配置檔,會啟動所有 services 目錄下的服務並開始 REPL 模式,如果服務改變時會 Hot Reload 。
start 腳本預設會讀取 moleculer.config.js 配置檔,如果檔案不存在的話則使用環境變數,接著會啟動所有 services 目錄下的服務。根據 CPU 數量啟動對應數量的 Broker 實例,最後啟動所有 services 目錄下的服務。

配置讀取邏輯

Runner 會根據以下步驟來讀取與合併配置:

  1. MOLECULER_CONFIG 環境變數讀取配置檔,如果檔案不存在則會拋出錯誤。
  2. 由 CLI 選項讀取配置檔,如果檔案不存在則會拋出錯誤。注意,如果 MOLECULER_CONFIG 存在則會被優先使用。
  3. 如果以上都未定義,則預設會讀取當前目錄的 moleculer.config.js 配置檔。如果不存在則會讀取 moleculer.config.json 檔案。
  4. 配置讀取完畢後,會將選項合併到 ServiceBroker 的預設選項。
  5. Runner 開始逐個檢視選項,並且嘗試從環境變數覆蓋它。例如你在配置檔中設定了 logLevel: "warn" ,但是環境變數也定義了 LOGLEVEL=debug ,這時候 Runner 會覆蓋它變成 logLevel: "debug"

假如你想在 .env 環境變數中對不存在於配置檔的深層對象做設定,請使用 MOL_ 作為前綴表示它是一個 Moleculer 的環境變數,以及雙底線 __ 作為巢狀屬性分隔符號。例如要將 cacher.options.prefix 設為 MOL ,會是這樣宣告 MOL_CACHER__OPTIONS__PREFIX=MOL

配置檔

配置檔的格式與 Broker 選項相同,每個屬性設定的名稱都相同。

範例:

moleculer.config.js

module.exports = {
    nodeID: "node-test",
    logger: true,
    logLevel: "debug",

    transporter: "nats://localhost:4222",
    requestTimeout: 5 * 1000,

    circuitBreaker: {
        enabled: true
    },

    metrics: true
};

異步配置檔

由於 Runner 也是一個 JS 程式,所以你可以使用異步的方式取得配置檔。這種情況下, moleculer.config.js 必須透過 Function 來返回一個 Promise

範例:

moleculer.config.js

const fetch = require("node-fetch");

module.exports = async function() {
	const res = await fetch("https://pastebin.com/raw/SLZRqfHX");
	return await res.json();
};

此函數跑在 MoleculerRunner 實例且包含了 this Context,所以你可以透過 runner 取得 flags 資料。更多資訊請參閱 Runner 原始碼[2] 。

環境變數

Runner 會將屬性名稱轉為大寫,如果有巢狀屬性則會將名稱轉為底線 _

範例:

NODEID=node-test
LOGGER=true
LOGLEVEL=debug

# 速記 Transporter
TRANSPORTER=nats://localhost:4222
REQUESTTIMEOUT=5000

# 巢狀屬性
CIRCUITBREAKER_ENABLED=true

METRICS=true

服務讀取邏輯

Runner 會由 CLI 參數讀取檔案或服務目錄。你可以由 SERVICESSERVICEDIR 環境變數來定義服務目錄,它會從指定的目錄及子目錄底下讀取所有的服務 **/*.service.js

Runner 會根據以下邏輯來讀取:

  1. 如果 .env 內的 SERVICEDIR 存在,但是 SERVICES 不存在,它會由 SERVICEDIR 目錄讀取所有的服務。
  2. 如果 .env 內的 SERVICEDIRSERVICES 同時存在,它會由 SERVICEDIR 目錄讀取指定的服務。
  3. 如果 .env 內的 SERVICEDIR 不存在,但是 SERVICES 存在,它會由當前的目錄讀取指定的服務。
  4. 由 CLI 確認參數,如果檔案或目錄存在則會讀取它。若發現 glob 匹配語法,則根據語意讀取找到的檔案。

注意,縮寫的檔案名稱也可以作為 SERVICES 參數被找到。

範例:在 services 目錄下讀取 math.service.jspost.service.jsuser.service.js 服務。

SERVICEDIR=services
SERVICES=math,post,user

範例:在 services 目錄及子目錄讀取所有的 *.service.js 服務。

SERVICEDIR=my-services

Glob 模式

如果你需要更多的方式,可以使用 glob 模式。它可以讓你很方便的來排除某些服務。

$ moleculer-runner services !services/others/**/*.service.js services/others/mandatory/main.service.js

說明:

  • services - 傳統方式。由 services 目錄下讀取 **/*.service.js 所有檔案。
  • !services/others/**/*.service.js - 排除 services/others 目錄及子目錄的服務。
  • services/others/mandatory/main.service.js - 載入指定的單一服務。

SERVICES 環境變數也可以使用 glob。

內建叢集

Runner 內建了一個叢集函數,可以用來啟動多個 Broker 實例。

例如:以 4 個實例來啟動 services 目錄下的所有的服務。

$ moleculer-runner --instances 4 services

叢集節點 ID,如果你在選項中定義了節點 ID 為 my-node ,當你啟動 4 個實例後,實例中的節點 ID 將會變成 my-node-1my-node-2my-node-3my-node-4

.env 檔案

Runner 可以在啟動時讀取 .env 檔案。你可以從兩個 CLI 選向來讀取 env 檔案。

  • -e, --env - 由當前目錄的 .env 檔案來讀取環境變數。
  • -E, --envfile <filename> - 從指定路徑讀取環境變數檔案。

範例:從當前目錄讀取 .env

$ moleculer-runner --env

範例:從指定路徑讀取 .env

$ moleculer-runner --envfile .my-env

參考文獻

[1] Moleculer Runner, https://moleculer.services/docs/0.14/runner.html
[2] Runner https://github.com/moleculerjs/moleculer/blob/master/src/runner.js

家家酒小劇場

  • Otter - Runner 真是個很棒的小幫手!
  • Boxy - 妳也是個很棒的小幫手呀,每天都幫我釋放一整天的壓力。
  • Otter - O///O

上一篇
Day 22 : Errors
下一篇
Day 24 : API 閘道器 - Part 1
系列文
Moleculer 家家酒31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言